home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
...taking it to the Macs!
/
...taking it to the Macs!.iso
/
Extras
/
ActiveX Mac SDK
/
ActiveX SDK
/
Control Common
/
CBaseBindStatusCallback.cpp
next >
Wrap
Text File
|
1996-12-30
|
6KB
|
239 lines
// =================================================================================
//
// CBaseBindStatusCallback.cpp ©1996 Microsoft Corporation All rights reserved.
//
// =================================================================================
#include "ocheaders.h"
#include "CBaseBindStatusCallback.h"
#include "urlmonsupport.h"
static FORMATETC FileFormatEtc = {
CF_NULL,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_FSP
};
#pragma mark === CBaseBindStatusCallback::Construction & Destruction ===
//
// CBaseBindStatusCallback::CBindStatusCallback
//
// Constructor
//
CBaseBindStatusCallback::CBaseBindStatusCallback(void)
{
}
//
// CBaseBindStatusCallback::~CBaseBindStatusCallback
//
// Destructor
//
CBaseBindStatusCallback::~CBaseBindStatusCallback(void)
{
}
#pragma mark === CBaseBindStatusCallback::IUnknown ===
//
// CBaseBindStatusCallback::IUnknown::QueryInterface
//
// Returns a pointer to the specified interface on a component to which a
// client currently holds an interface pointer.
//
STDMETHODIMP
CBaseBindStatusCallback::QueryInterface(REFIID inRefID, void** outObj)
{
ErrorCode Result = CBaseCOM::QueryInterface(inRefID, outObj);
if ( Result == E_NOINTERFACE )
{
void* pv = nil;
if ( inRefID == IID_IBindStatusCallback )
pv = (void*)(IBindStatusCallback*) this;
*outObj = pv;
// if we got an interface, ref it and return ok
if ( pv )
{
((IUnknown*) pv)->AddRef();
Result = S_OK;
}
}
return Result;
}
#pragma mark === CBaseBindStatusCallback::IBindStatusCallback ===
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::OnStartBinding
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::OnStartBinding(Uint32 BSCOption, IBinding* Binding)
{
#pragma unused (BSCOption)
mibP = Binding;
mibP->AddRef();
mTotalStreamLen = 0;
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::GetPriority
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::GetPriority(Int32 *Priority)
{
*Priority = 0;
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::OnLowResource
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::OnLowResource(Uint32 reserved)
{
#pragma unused (reserved)
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::OnProgress
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::OnProgress(Uint32 Progress, Uint32 ProgressMax, Uint32 StatusCode, const Char8* StatusText)
{
#pragma unused (Progress, ProgressMax, StatusCode, StatusText)
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::OnStopBinding
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::OnStopBinding(ErrorCode ErrCode, const char* Error)
{
#pragma unused (ErrCode, Error)
if (mibP != NULL)
mibP->Release();
mibP = NULL;
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::GetBindInfo
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::GetBindInfo(Uint32* BINDF, BINDINFO *BindInfo)
{
*BINDF = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE;
BindInfo->dwBindVerb = BINDVERB_GET;
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::OnDataAvailable
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::OnDataAvailable(Uint32 BSCF, Uint32 Size, FORMATETC* FormatEtc, STGMEDIUM* StgMedium)
{
#pragma unused (BSCF, Size, FormatEtc, StgMedium)
mDataSize = BSCF == BSCF_LASTDATANOTIFICATION ? 0 : Size;
mTotalStreamLen += mDataSize;
return S_OK;
}
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::IBindStatusCallback::OnObjectAvailable
//=--------------------------------------------------------------------------=
//
STDMETHODIMP
CBaseBindStatusCallback::OnObjectAvailable(REFIID RefID, IUnknown* Unknown)
{
#pragma unused (RefID, Unknown)
return S_OK;
}
#pragma mark === CBaseBindStatusCallback::Protected Methods ===
//=--------------------------------------------------------------------------=
// CBaseBindStatusCallback::OpenStream
//=--------------------------------------------------------------------------=
//
ErrorCode
CBaseBindStatusCallback::OpenStream(IContainerSite* inContainerSiteP, LPOLESTR URLString, Boolean BindFile)
{
ErrorCode Result = E_FAIL;
#pragma unused(BindFile)
LPBINDHOST BindSiteP;
LPENUMFORMATETC pEnum = NULL;
LPMONIKER URLMoniker = NULL;
LPBINDCTX BindContext = NULL;
inContainerSiteP->QueryInterface(IID_IBindHost, (LPVOID *) &BindSiteP);
if (BindSiteP)
{
Result = BindSiteP->CreateMoniker((LPOLESTR)URLString, NULL, &URLMoniker, 0);
if(SUCCEEDED(Result) && URLMoniker)
{
void* Dummy;
// if BindFile, register enumerator so we get a file
if(BindFile)
{
Result = CreateBindCtx( 0, &BindContext);
if(SUCCEEDED(Result))
Result = CreateFormatEnumerator(1, &FileFormatEtc, &pEnum);
if(SUCCEEDED(Result))
RegisterFormatEnumerator(BindContext, pEnum, 0);
}
Result = BindSiteP->MonikerBindToStorage(URLMoniker, BindContext,
(IBindStatusCallback*)this, IID_IStream, &Dummy);
if(Result == E_PENDING)
Result = S_OK;
if(BindContext)
BindContext->Release();
if(pEnum)
pEnum->Release();
URLMoniker->Release();
}
}
return Result;
}